"""
读取 CSV
"""


import pandas as pd

from my_typing import *
from utils.data_utils import ExcelHeaderInfo


class CSVReader:
    """ CSV 读取器 """

    def __init__(
        self,
        file_name: StrOrBytesIO,
        header_info_list: list[ExcelHeaderInfo],
        encoding: Literal["UTF-8", "GBK"] = "UTF-8",
    ) -> None:
        """
        Args:
            file_name: CSV 文件
            header_info_list: 标题信息列表
            encoding: 字符编码（默认为 UTF-8）
        """

        self.header_en_2_cn: DictStrStr = {
            header_info.name: header_info.label
            for header_info in header_info_list
        }
        """ 标题名称映射（英文-中文） """

        self.header_cn_2_type: dict[str, Callable] = {
            header_info.label: header_info.type
            for header_info in header_info_list
        }
        """ 标题类型映射（中文标题-数据类型） """

        self.header_cn_2_en: DictStrStr = {
            en_title: cn_title
            for cn_title, en_title in self.header_en_2_cn.items()
        }
        """ 标题映射（中文-英文） """

        self.file_name: StrOrBytesIO = file_name
        """ CSV 文件 """

        self.encoding: str = encoding
        """ 字符编码 """

    def read(self) -> ListDict:
        """ 读取数据 """

        df: pd.DataFrame = pd.read_csv(
            filepath_or_buffer=self.file_name,
            usecols=list(self.header_cn_2_en),
            converters=self.header_cn_2_type,
            encoding=self.encoding,
        )
        data_dic: dict[str, dict[int, Any]] = df.to_dict()
        index_2_data: dict[int, dict] = {}

        for cn_title, idx_2_value in data_dic.items():
            en_title: str = self.header_cn_2_en.get(cn_title)

            for idx, value in idx_2_value.items():
                index_2_data.setdefault(idx, {}).update({en_title: value})

        return list(index_2_data.values())
